//
//  BindingProtocol.swift
//  SLDatabase
//
//  Created by 姚胜龙 on 2017/7/3.
//  Copyright © 2017年 姚胜龙. All rights reserved.
//

//绑定参数类型协议 ,这个是最基础的类（协议），在这里面不要写东西
public protocol Binding {

}

//根据OC中扩展的特性 我们可以对swift扩展
//扩展 Int、Double、Float、String、Bool。。。

//可以将以上的所有类型分成两个类型扩展 数字类型和 值类型

//1、数字类型：Number类型（Int、Double、Float ...）
public protocol Number: Binding {

}

//2、值类型：Value类型(String、Bool...) 将程序中的类型和数据库的类型一一对应起来
//Value协议作用一：保存了数据库表字段名称和类型 对应 程序当中的属性名称和类型
//Value协议作用二：并不知道是什么类型，然而还要规定类型 --> 泛型

public protocol Value : Expressible {
    //泛型一：数据类型（程序中的数据类型Int、Double、Float...）
    associatedtype DataType:Binding

    //泛型二：返回类型 （程序当中返回值类型）(有可能进行类型转换)
    //例如：数据库 intager 对应程序中的 Int Int32 Int64 ...
    associatedtype ValueType = Self //直接返回当前类型就可以了

    //一个静态属性和一个静态方法
    //作用：数据库表字段名称 和 表字段类型
    //属性：数据库表字段 -> 一定是String类型
    static var declareDataType: String{get}
    //方法：将程序中的数据类型->转成->数据库类型
    static func fromDataTypeValue(_ dataTypeValue: DataType) -> ValueType

    //对象属性
    //作用:定义了当前返回值类型
    var dataTypeValue:DataType { get }
    
}

//扩展
extension Double : Number,Value {
    //程序中的Double类型->对应->数据库中的“REAL”类型
    public static var declareDataType = "REAL"

    public static func fromDataTypeValue(_ dataTypeValue: Double) -> Double {
        return dataTypeValue
    }
    public var dataTypeValue: Double {
        return self
    }
}

extension Int: Number,Value {
    //程序中的Int类型->对应->数据库中的“INTEGER”类型
    public static var declareDataType = "INTEGER"

    public static func fromDataTypeValue(_ dataTypeValue: Int) -> Int {
        return dataTypeValue
    }
    public var dataTypeValue: Int {
        return self
    }
}

extension Float: Number, Value {
    //程序中的Float类型->对应->数据库中的“REAL”类型
    public static var declareDataType = "REAL"

    public static func fromDataTypeValue(_ dataTypeValue: Float) -> Float {
        return dataTypeValue
    }
    public var dataTypeValue: Float {
        return self
    }
}

extension Int32: Number, Value {
    //程序中的Int32类型->对应->数据库中的“INTEGER”类型
    public static var declareDataType = "INTEGER"

    public static func fromDataTypeValue(_ dataTypeValue: Int32) -> Int32 {
        return dataTypeValue
    }
    public var dataTypeValue: Int32 {
        return self
    }
}

extension Int64: Number, Value {
    //程序中的Int64类型->对应->数据库中的“INTEGER”类型
    public static var declareDataType = "INTEGER"

    public static func fromDataTypeValue(_ dataTypeValue: Int64) -> Int64 {
        return dataTypeValue
    }
    public var dataTypeValue: Int64 {
        return self
    }
}

//等等。。。 以此类推扩展


extension String :Binding, Value {
    //程序中的String类型->对应->数据库中的“TEXT”类型
    public static var declareDataType = "TEXT"

    public static func fromDataTypeValue(_ dataTypeValue: String) -> String {
        return dataTypeValue
    }
    public var dataTypeValue: String {
        return self
    }
}

extension Bool:Binding, Value {
    //程序中的Bool类型->对应->数据库中的“0和1”类型
    public static var declareDataType = Int.declareDataType

    public static func fromDataTypeValue(_ dataTypeValue: Int) -> Bool {
        return dataTypeValue != 0
    }
    public var dataTypeValue: Int {
        return self ? 1 : 0
    }
}





